﻿using System;

namespace _022_命名参数
{
    class Program
    {
        // 可选参数
        static void Foo(int x = 0, int y = 0)
        {
            Console.WriteLine(x + "," + y);
        }
        static void Main(string[] args)
        {
            Foo(x: 1, y: 2);// 1, 2

            // 命名参数能按任意顺序出现
            // 下面两种调用Foo方法在语义上是一样的：
            Foo(x: 1, y: 2);
            Foo(y: 2, x: 1);

            // 不同的是参数表达是按调用端参数出现的顺序计算。通常，这只对相互作用的局部表达式有所不同。
            // 像下面的代码，它将输出 0, 1
            int a = 0;
            Foo(y: ++a, x: --a);

            // 命名参数和可选参数可以混合使用
            Foo(1, y: 2);

            // 然而，这里有规定：按位置的参数必须出现在命名参数之前，因此不能这样调用Foo方法
            Foo(x: 1, 2); // 编译时错误，、、我自己测试能输出？？？why

            Bar(d: 3);
            Console.ReadKey();
        }

        static void Bar(int a = 0, int b = 0, int c = 0, int d = 0)
        {
            Console.WriteLine($"{a},{b},{c},{d}");
        }
    }
}